package com.transaction.common.util;

import java.math.BigDecimal;
import java.util.Random;
import java.util.UUID;

public class CodeUtil {


    public static String getCode(){
        return UUID.randomUUID().toString().replaceAll("-","");
    }

    /**
     * 随机一个性别
     * @Title: randomSex
     * @author: dy.yin 2021/8/18 14:32
     * @param: [num]
     * @return: java.util.List<java.lang.String>
     * @throws
     */
    public static String randomSex(){
        return String.valueOf(new Random().nextInt(10));
    }

    /**
     * 随机一个警局所在地
     * @Title: randomLocation
     * @author: dy.yin 2021/8/18 14:38
     */
    public static String randomLocation(){
        return String.valueOf(new Random().nextInt(90) + 10);
    }

    /**
     * 根据前17位生成最后一位，并组装
     * @Title: identityNo
     * @author: dy.yin 2021/8/18 15:54
     */
    public static String identityNo(String prefix) {
        //1.step1,2
        Integer sum = executeStepOneAndTwo(prefix);
        //2.step3,4
        String identityNo = executeStepThreeAndFour(prefix,sum);

        return identityNo;
    }

    /**
     * 每个位数相乘然后求和
     * @Title: executeStepOneAndTwo
     * @author: dy.yin 2021/8/19 13:14
     */
    private static Integer executeStepOneAndTwo(String prefix) {
        Integer sum = calculateSumForEveryNo(prefix);
        return  sum;
    }

    /**
     * 计算身份证前17位的和
     * 第一步：
     * 将身份证号码的第1位数字与7相乘；
     * 将身份证号码的第2位数字与9相乘；
     * 将身份证号码的第3位数字与10相乘；
     * 将身份证号码的第4位数字与5相乘；
     * 将身份证号码的第5位数字与8相乘；
     * 将身份证号码的第6位数字与4相乘；
     * 将身份证号码的第7位数字与2相乘；
     * 将身份证号码的第8位数字与1相乘；
     * 将身份证号码的第9位数字与6相乘；
     * 将身份证号码的第10位数字与3相乘；
     * 将身份证号码的第11位数字与7相乘；
     * 将身份证号码的第12位数字与9相乘；
     * 将身份证号码的第13位数字与10相乘；
     * 将身份证号码的第14位数字与5相乘；
     * 将身份证号码的第15位数字与8相乘；
     * 将身份证号码的第16位数字与4相乘；
     * 将身份证号码的第17位数字与2相乘。
     *
     * 第二步：将第一步身份证号码1~17位相乘的结果求和，全部加起来。
     * @Title: calculateSumForEveryNo
     * @author: dy.yin 2021/8/19 13:21
     */
    private static Integer calculateSumForEveryNo(String prefix) {
        int length = prefix.length();
        int sum = 0;
        for(int i = 0; i < length; i++){
            switch (i){
                case 0 :
                case 10 :
                    sum += (prefix.charAt(i)-'0') * 7;break;

                case 2 :
                case 12 :
                    sum += (prefix.charAt(i)-'0') * 10;break;

                case 3 :
                case 13 :
                    sum += (prefix.charAt(i)-'0') * 5;break;

                case 4 :
                case 14 :
                    sum += (prefix.charAt(i)-'0') * 8;break;

                case 5 :
                case 15 :
                    sum += (prefix.charAt(i)-'0') * 4;break;

                case 6 :
                case 16 :
                    sum += (prefix.charAt(i)-'0') * 2;break;

                case 1 :
                case 11 :
                    sum += (prefix.charAt(i)-'0') * 9;break;

                case 7 : sum += (prefix.charAt(i)-'0') * 1;break;
                case 8 : sum += (prefix.charAt(i)-'0') * 6;break;
                case 9 : sum += (prefix.charAt(i)-'0') * 3;break;
            }
        }
        return sum;
    }

    /**
     * 计算最后一位
     * @Title: executeStepThreeAndFour
     * @author: dy.yin 2021/8/19 13:36
     * 第三步：用第二步计算出来的结果除以11，
     * 这样就会出现余数为0，余数为1，余数为2，余数为3，余数为4，余数为5，余数为6，余数为7，余数为8，余数为9，
     * 余数为10共11种可能性。
     *
     * 第四步：
     * 如果余数为0，那对应的最后一位身份证的号码为1；
     * 如果余数为1，那对应的最后一位身份证的号码为0；
     * 如果余数为2，那对应的最后一位身份证的号码为X；
     * 如果余数为3，那对应的最后一位身份证的号码为9；
     * 如果余数为4，那对应的最后一位身份证的号码为8；
     * 如果余数为5，那对应的最后一位身份证的号码为7；
     * 如果余数为6，那对应的最后一位身份证的号码为6；
     * 如果余数为7，那对应的最后一位身份证的号码为5；
     * 如果余数为8，那对应的最后一位身份证的号码为4；
     * 如果余数为9，那对应的最后一位身份证的号码为3；
     * 如果余数为10，那对应的最后一位身份证的号码为2。
     */
    private static String executeStepThreeAndFour(String prefix, Integer sum) {
        String suffix = calculateLastNo(sum);
        prefix += suffix;
        return  prefix;
    }

    /**
     * 根据前17位的和计算最后一位
     * @Title: calculateLastNo
     * @author: dy.yin 2021/8/19 13:48
     * @param: [sum]
     * @return: java.lang.String
     * @throws
     */
    private static String calculateLastNo(int sum) {
        String suffix = "";
        int remainder = sum % 11;
        switch (remainder){
            case 0 : suffix = "1";break;
            case 1 : suffix = "0";break;
            case 2 : suffix = "X";break;
            case 3 : suffix = "9";break;
            case 4 : suffix = "8";break;
            case 5 : suffix = "7";break;
            case 6 : suffix = "6";break;
            case 7 : suffix = "5";break;
            case 8 : suffix = "4";break;
            case 9 : suffix = "3";break;
            case 10 : suffix = "2";break;
        }
        return suffix;
    }


    /**
     * 生成手机号
     * @Title: generateMobileNo
     * @author: dy.yin 2021/8/19 15:06
     */
    public static String generateMobileNo() {
        StringBuilder sb = new StringBuilder();
        Random random = new Random();
        int op = random.nextInt(3);//随机运营商标志位
        String mobilePrefix;//手机号前三位
        int temp;
        switch (op) {
            case 0:
                mobilePrefix = ConstUtil.CHINA_MOBILE[random.nextInt(ConstUtil.CHINA_MOBILE.length)];
                break;
            case 1:
                mobilePrefix = ConstUtil.CHINA_UNICOM[random.nextInt(ConstUtil.CHINA_UNICOM.length)];
                break;
            case 2:
                mobilePrefix = ConstUtil.CHINA_TELECOME[random.nextInt(ConstUtil.CHINA_TELECOME.length)];
                break;
            default:
                mobilePrefix = "op标志位有误！";
                break;
        }
        if (mobilePrefix.length() > 3) {
            return mobilePrefix;
        }
        sb.append(mobilePrefix);
        //生成手机号后8位
        for (int i = 0; i < 8; i++) {
            temp = random.nextInt(10);
            sb.append(temp);
        }
        return sb.toString();
    }

    //随机生成产品每日的万分收益
    public static BigDecimal generateFundEveryDayIncome() {
        //1、初始值1
        //2、随机正负
        //3、第一位1-3
        //4、2-4位0-9
        Random random = new Random();
        int sign = random.nextInt(2);
        int first = random.nextInt(3) + 1;
        int second = random.nextInt(10);
        int three = random.nextInt(10);
        int four = random.nextInt(10);

        BigDecimal inComeFloat = new BigDecimal("0." + first + "" + second + "" + three + "" + four);
        BigDecimal base = new BigDecimal(1);
        if(sign == 0){
            return base.add(inComeFloat);
        }
        return base.subtract(inComeFloat);
    }

    public static BigDecimal generateFundEveryDayYield() {
        //1、第一位2-4
        //2、2-4位0-9
        Random random = new Random();
        int first = random.nextInt(3) + 2;
        int second = random.nextInt(10);
        int three = random.nextInt(10);
        int four = random.nextInt(10);

        return new BigDecimal("0.0" + first + "" + second + "" + three + "" + four);
    }
}
